package cn.zxh.improvement.common.core.context;

import io.vavr.control.Option;

import java.util.Map;
import java.util.function.BiPredicate;

/**
 * 应用环境配置
 *
 * @author zxh
 * @since 2023-4-28 16:43:06
 */
public interface EnvironmentConfig {

    /**
     * 获取应用配置
     *
     * @return 应用配置
     */
    static EnvironmentConfig getInstance() {
        return Context.getInstance().getBean(EnvironmentConfig.class, DefaultEnvironmentConfig.INST);
    }


    /**
     * 根据属性名获取值，并用Option包裹
     *
     * @param name 配置属性名
     * @return 属性值
     */
    Option<String> getValue(String name);

    /**
     * 获取属性值，如果不存在采用默认值
     *
     * @param name 属性名
     * @param def  配置值
     * @return 配置值
     */
    default String getValue(String name, String def) {
        return getValue(name).getOrElse(def);
    }

    /**
     * 设置配置值
     *
     * @param name  配置属性名
     * @param value 配置属性值
     */
    void setValue(String name, String value);

    /**
     * 获取属性值并转Integer类型，如果不存在采用默认值
     *
     * @param name 配置属性名
     * @param def  默认值
     * @return 配置值
     */
    default int getInteger(String name, int def) {
        return getValue(name).map(Integer::parseInt).getOrElse(def);
    }

    /**
     * 获取属性值并转Boolean类型，如果不存在采用默认值
     *
     * @param name 配置属性名
     * @param def  默认值
     * @return 配置值
     */
    default boolean getBoolean(String name, boolean def) {
        return getValue(name).map(Boolean::parseBoolean).getOrElse(def);
    }

    /**
     * 获取属性值并转Long类型，如果不存在采用默认值
     *
     * @param name 配置属性名
     * @param def  默认值
     * @return 配置值
     */
    default long getLong(String name, long def) {
        return getValue(name).map(Long::parseLong).getOrElse(def);
    }

    /**
     * 获取属性值并转Double类型，如果不存在采用默认值
     *
     * @param name 配置属性名
     * @param def  默认值
     * @return 配置值
     */
    default double getDouble(String name, double def) {
        return getValue(name).map(Double::parseDouble).getOrElse(def);
    }

    /**
     * 获取属性值并转Float类型，如果不存在采用默认值
     *
     * @param name 配置属性名
     * @param def  默认值
     * @return 配置值
     */
    default float getFloat(String name, float def) {
        return getValue(name).map(Float::parseFloat).getOrElse(def);
    }

    /**
     * 获取属性值并转Short类型，如果不存在采用默认值
     *
     * @param name 配置属性名
     * @param def  默认值
     * @return 配置值
     */
    default short getShort(String name, short def) {
        return getValue(name).map(Short::parseShort).getOrElse(def);
    }

    /**
     * 根据条件筛选符合属性的值
     *
     * @param predicate 过滤函数
     * @return 过滤结果
     */
    Map<String, String> filter(BiPredicate<String, Object> predicate);

}
